home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / gnu / mtools.lha / mtools-2.0.7 / match.c < prev    next >
C/C++ Source or Header  |  1992-09-10  |  2KB  |  92 lines

  1. /*
  2.  * Do shell-style pattern matching for '?', '\', '[..]', and '*' wildcards.
  3.  * Returns 1 if match, 0 if not.
  4.  */
  5.  
  6. #include <stdio.h>
  7.  
  8. int
  9. match(s, p)
  10. char *s, *p;
  11. {
  12.     int matched, reverse;
  13.     char first, last;
  14.  
  15.     for (; *p != '\0'; s++, p++) {
  16.         switch (*p) {
  17.             case '?':    /* match any one character */
  18.                 if (*s == '\0')
  19.                     return(0);
  20.                 break;
  21.             case '*':    /* match everything */
  22.                 while (*p == '*')
  23.                     p++;
  24.  
  25.                     /* if last char in pattern */
  26.                 if (*p == '\0')
  27.                     return(1);
  28.  
  29.                     /* search for next char in pattern */
  30.                 matched = 0;
  31.                 while (*s != '\0') {
  32.                     if (*s == *p) {
  33.                         matched = 1;
  34.                         break;
  35.                     }
  36.                     s++;
  37.                 }
  38.                 if (!matched)
  39.                     return(0);
  40.                 break;
  41.             case '[':     /* match range of characters */
  42.                 first = '\0';
  43.                 matched = 0;
  44.                 reverse = 0;
  45.                 while (*++p != ']') {
  46.                     if (*p == '^') {
  47.                         reverse = 1;
  48.                         p++;
  49.                     }
  50.                     first = *p;
  51.                     if (first == ']' || first == '\0')
  52.                         return(0);
  53.  
  54.                     /* if 2nd char is '-' */
  55.                     if (*(p + 1) == '-') {
  56.                         p++;
  57.                     /* set last to 3rd char ... */
  58.                         last = *++p;
  59.                         if (last == ']' || last == '\0')
  60.                             return(0);
  61.                     /* test the range of values */
  62.                         if (*s >= first && *s <= last) {
  63.                             matched = 1;
  64.                             p++;
  65.                             break;
  66.                         }
  67.                         return(0);
  68.                     }
  69.                     if (*s == *p)
  70.                         matched = 1;
  71.                 }
  72.                 if (matched && reverse)
  73.                     return(0);
  74.                 if (!matched)
  75.                     return(0);
  76.                 break;
  77.             case '\\':    /* Literal match with next character */
  78.                 p++;
  79.                 /* fall thru */
  80.             default:
  81.                 if (*s != *p)
  82.                     return(0);
  83.                 break;
  84.         }
  85.     }
  86.                     /* string ended prematurely ? */
  87.     if (*s != '\0')
  88.         return(0);
  89.     else
  90.         return(1);
  91. }
  92.